package com.dingwen.stusprboomon.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * 参数类型转换工具类
 *
 * @author dingwen
 * 2021.06.28 09:29
 */
public class CastUtil {
    /**
     * 函数集合
     */
    private static final Map<String, Function<Object, Object>> FUNCTION_MAP = new HashMap<>();

    static {
        FUNCTION_MAP.put(Byte.TYPE.getName(), value -> castToByte((String) value));
        FUNCTION_MAP.put(Integer.TYPE.getName(), value -> castToInteger((String) value));
        FUNCTION_MAP.put(Boolean.TYPE.getName(), value -> castToBoolean((String) value));
        FUNCTION_MAP.put(Double.TYPE.getName(), value -> castToDouble((String) value));
        FUNCTION_MAP.put(Float.TYPE.getName(), value -> castToFloat((String) value));
        FUNCTION_MAP.put(Long.TYPE.getName(), value -> castToLong((String) value));
        FUNCTION_MAP.put(LocalDateTime.class.getSimpleName(), value -> castToDate((String) value));
        FUNCTION_MAP.put(Short.class.getSimpleName(), value -> castToShort((String) value));


    }

    /**
     * 转换
     *
     * @param type  类型
     * @param value 价值
     * @return {@link Object}
     */
    public static Object cast(String type, String value) {
        return FUNCTION_MAP.get(type).apply(value);
    }


    /**
     * 转换为字节
     *
     * @param value 价值
     * @return {@link Byte}
     */
    public static Byte castToByte(String value) {
        return Byte.valueOf(value.trim());
    }

    /**
     * 转换为整数
     *
     * @param value 价值
     * @return {@link Integer}
     */
    public static Integer castToInteger(String value) {
        return Integer.valueOf(value.trim());
    }

    /**
     * 转换为布尔
     *
     * @param value 价值
     * @return {@link Boolean}
     */
    public static Boolean castToBoolean(String value) {
        if (Boolean.TRUE.toString().equalsIgnoreCase(value)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }


    /**
     * 转换为double
     *
     * @param value 价值
     * @return {@link Double}
     */
    public static Double castToDouble(String value) {
        return Double.parseDouble(value.trim());
    }

    /**
     * 转换为浮点数
     *
     * @param value 价值
     * @return {@link Float}
     */
    public static Float castToFloat(String value) {
        return Float.parseFloat(value.trim());
    }


    /**
     * 转换为 Long
     *
     * @param value 价值
     * @return {@link Long}
     */
    public static Long castToLong(String value) {
        return Long.parseLong(value.trim());
    }

    /**
     * 转换为 LocalDateTime
     *
     * @param value 价值
     * @return {@link LocalDateTime}
     */
    public static LocalDateTime castToDate(String value) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
        return LocalDateTime.parse(value, dateTimeFormatter);

    }


    /**
     * 转换为 short
     *
     * @param value 价值
     * @return {@link Short}
     */
    public static Short castToShort(String value) {
        return Short.parseShort(value.trim());
    }
}
